import { defineConfig, loadEnv } from 'vite'
import type { UserConfig, ConfigEnv } from 'vite'
import createVitePlugins from './vite/plugins'
import { buildFun } from './vite/build'
import path, { resolve } from 'path'
// defineConfig 工具函数，这样不用 jsdoc 注解也可以获取类型提示
export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
  const root = process.cwd()
  const env = loadEnv(mode, root) // 环境变量对象
  const buildObj = buildFun(env)
  // // dev 独有配置
  return {
    root, //项目根目录（index.html 文件所在的位置） 默认： process.cwd()
    base: './', //  开发或生产环境服务的公共基础路径：默认'/'   1、绝对 URL 路径名： /foo/；  2、完整的 URL： https://foo.com/； 3、空字符串或 ./（用于开发环境）
    publicDir: resolve(__dirname, './dist'), //默认'public'  作为静态资源服务的文件夹  (打包public文件夹会没有，里面得东西会直接编译在dist文件下)
    assetsInclude: resolve(__dirname, './src/assets'), // 静态资源处理
    // ******插件配置******
    //配置插件
    plugins: createVitePlugins(env, env.VITE_USER_NODE_ENV === 'production'),
    // ******开发服务器配置******
    css: {
      devSourcemap: false, // css sourceMap 配置
      modules: {
        // css模块化 文件以.module.[css|less|scss]结尾
        generateScopedName: '[name]__[local]___[hash:base64:5]',
        hashPrefix: 'prefix'
      },
      preprocessorOptions: {
        scss: {
          additionalData: `@use "@/assets/styles/common/index.scss" as *;`
        }
      }
    },
    //build
    ...buildObj,
    // ******resolver配置******
    resolve: {
      alias: {
        // 如果报错__dirname找不到，需要安装node,执行npm install @types/node --save-dev
        '@': path.resolve(__dirname, './src'),
        '@assets': path.resolve(__dirname, './src/assets'),
        '@components': path.resolve(__dirname, './src/components'),
        '@images': path.resolve(__dirname, './src/assets/images'),
        '@views': path.resolve(__dirname, './src/views'),
        '@store': path.resolve(__dirname, './src/store'),
        'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js'
      },
      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.scss']
    },
    optimizeDeps: {
      include: ['async-validator']
    },
    server: {
      https: false, //(使用https)启用 TLS + HTTP/2。注意：当 server.proxy 选项 也被使用时，将会仅使用 TLS
      host: true, // 监听所有地址
      port: 8080, //指定开发服务器端口：默认3000
      // open: true, //启动时自动在浏览器中打开
      proxy: {
        //配置自定义代理规则
        // 字符串简写写法
        // "/jpi": "http://192.168.1.97:4567",
        '/api': {
          target: env.VITE_APP_BASE_API,
          changeOrigin: true, //是否跨域
          rewrite: path => path.replace(/^\/api/, '')
        }
      },
      hmr: {
        overlay: false
      }
    }
  }
})
